#include "visit.h"

/*!
 *@brief 访问数字(包含int和float)
 *@param node AST节点指针
 *@param s 符号表指针
 *@param bb 基本块指针
 *@return variant<int, float>类型
 *@note 使用
    if(auto pval = std::get_if<int>(&v))
        int value = *pval;
    else 
        float value = *pval;
 */
variant<int, float> visit_number(ASTNode* node, SymbolTable* s, BasicBlock* bb) {
    
    if (!node){
        variant<int, float> res;
        res = 0;
        return res;
    }

    ASTNode* child = node->children[0];
    variant<int, float> res;
    if (child->type == "IntConst") {
        // 处理整数常量
        try{
            res = stoi(child->value);
        }
        catch (...) {
            // 捕获所有可能的异常
            std::cerr << "转换失败, child->value 的值无法解析为整数。" << std::endl;
            res = 0;  // 设置默认值
        }

    }
    else if(child->type == "floatConst"){
        // 处理浮点数
        try{
            res = stof(child->value);
        }
        catch (...) {
            // 捕获所有可能的异常
            std::cerr << "转换失败, child->value 的值无法解析为整数。" << std::endl;
            res = 0;  // 设置默认值
        }
    }

    return res;

}